home *** CD-ROM | disk | FTP | other *** search
- Aggression: dc.w 0
- Movement: dc.w 0
- Cooperation: dc.w 0
- GunType: dc.w 0
- Ident: dc.w 0
- friends: dc.l 0
- enemies: dc.l 0
- numfriends: dc.w 0
- numenemies: dc.w 0
- disttofriend: dc.l 0
- disttoenemy: dc.l 0
- closefriend: dc.l 0
- closeenemy: dc.l 0
- Armed: dc.w 0
-
- VisibleTab: ds.l 100
-
- AIControl:
-
- ; First need to see if any enemy are
- ; visible, so make a list of which
- ; objects are visible to this
- ; particular creature.
-
- move.l #ObjectData,a1
- move.l #VisibleTab,a2
- move.l #ZoneAdds,a3
- move.w 12(a0),d0
- move.l (a3,d0.w*4),FromRoom
- move.w (a0),d0
- move.l #ObjectPoints,a4
- move.w (a4,d0.w*8),oldx
- move.w 4(a4,d0.w*8),oldz
-
- move.l #$7fffffff,d0
- move.l d0,disttofriend
- move.l d0,disttoenemy
- move.w #1,numfriends
- move.w #0,numenemies
-
- BuildVisibleList:
- tst.w (a1)
- blt BuiltList
- clr.b (a2)
- cmp.l a1,a0
- beq myself
-
- tst.b 16(a1)
- blt myself
- move.b Ident,d0
- ; cmp.b 16(a1),d0
- ; beq myself
- move.w 12(a1),d0
- blt notvisible
- move.l (a3,d0.w*4),ToRoom
- move.w (a1),d0
- move.w (a4,d0.w*8),newx
- move.w 4(a4,d0.w*8),newz
- movem.l a0/a1/a2/a3/a4,-(a7)
- jsr CanItBeSeen
- movem.l (a7)+,a0/a1/a2/a3/a4
- move.b CanSee,(a2)
- beq.s notvisible
-
- move.b 16(a1),d0
- moveq #0,d1
- bset d0,d1
- move.l d1,d0
- and.l friends(pc),d0
- beq.s notafriend
- addq.w #1,numfriends
- move.w xdiff,d0
- move.w zdiff,d1
- muls d0,d0
- muls d1,d1
- add.l d0,d1
- cmp.l disttofriend(PC),d1
- bgt.s notclosestfriend
- move.l d1,disttofriend
- move.l a1,closefriend
- notclosestfriend:
-
- move.l d1,2(a2)
- bra.s isafriend
-
- notafriend:
- and.l enemies(pc),d1
- beq.s notanenemy
- addq.w #1,numenemies
- move.w xdiff,d0
- move.w zdiff,d1
- muls d0,d0
- muls d1,d1
- add.l d0,d1
- cmp.l disttoenemy(PC),d1
- bgt.s notclosestenemy
- move.l d1,disttoenemy
- move.l a1,closeenemy
- notclosestenemy:
-
- move.l d1,2(a2)
-
- notanenemy:
- isafriend:
-
- notvisible:
-
- myself:
- adda.w #64,a1
- addq #6,a2
- bra BuildVisibleList
-
- BuiltList:
-
- tst.w numenemies
- beq NonCombatant
-
- Combatant:
-
- * The thing can see some enemies
- * so do something about it, depending
- * upon aggression, movement and
- * cooperation stats.
-
- move.w Aggression,d0
- move.w Movement,d1
- move.w Cooperation,d2
- move.w numenemies,d3
- sub.w numfriends,d3
-
- * What does the thing do?
- * If very unaggressive, or
- * outnumbered, head for
- * the last place it could see no
- * enemy, and shoot if armed.
-
- * If medium aggression and not
- * outnumbered, run towards and
- * attack the enemy (unarmed) or stand
- * and shoot (armed)
-
- * If very high aggression, run
- * towards and attack the enemy, if
- * no gun, otherwise move forward
- * shooting.
-
- cmp.w #10,d0
- ble CNA
- cmp.w #20,d0
- bgt CA
- tst.w d3
- bgt CNA
- ble CA
- rts
-
- CA:
-
- ; The thing is combatant and very
- ; aggressive.
- ; If it is cooperative it will only
- ; attack if alone, otherwise it will
- ; follow its leader.
-
- cmp.w #1,numfriends
- ble.s mustattack
- cmp.w #20,d1
- bge CAC
- mustattack:
-
- move.l closeenemy,a2
- move.w (a2),d0
- lea (a4,d0.w*8),a1
- move.w (a1),newx
- move.w 4(a1),newz
- move.w maxspd(a0),d2
- muls TempFrames,d2
-
- tst.b Armed
- beq.s .unarmed
- asr.w #1,d2
- .unarmed
- move.w d2,speed
- move.w #20,Range
- move.l FromRoom,objroom
-
- movem.l a0/a1/a4,-(a7)
-
- jsr HeadTowardsAng
- jsr MoveObject
-
- movem.l (a7)+,a0/a1/a4
-
-
- move.w (a0),d0
- lea (a4,d0.w*8),a1
- move.w newx,(a1)
- move.w newz,4(a1)
- move.l objroom,a2
- move.w (a2),12(a0)
-
- tst.b Armed
- beq.s .nofire
-
- move.l a0,-(a7)
-
- move.w (a1),tempxoff
- move.w 4(a1),tempzoff
- move.w SinRet(pc),tempxdir
- move.w CosRet(pc),tempzdir
- move.w #3,tempGunNoise
- move.b #0,tempGotBigGun
- move.b #1,tempGunDamage
- move.l objroom,tempRoompt
- bsr pressedfire
- move.l (a7)+,a0
- .nofire:
-
- rts
-
- CAC:
- ; the thing should stay with its
- ; group, but shoot if it is armed.
-
- bsr FollowOthers
-
- tst.b Armed
- beq.s .nofire
-
- move.l a0,-(a7)
-
- move.w (a1),tempxoff
- move.w 4(a1),tempzoff
- move.w SinRet(pc),tempxdir
- move.w CosRet(pc),tempzdir
- move.w #3,tempGunNoise
- move.b #0,tempGotBigGun
- move.b #1,tempGunDamage
- move.l objroom,tempRoompt
- bsr pressedfire
- move.l (a7)+,a0
- .nofire:
-
- rts
-
-
- CNA:
-
- ; The thing is in a combatant situation
- ; but is extremely unaggressive. It
- ; should therefore retreat from the
- ; enemy unless cooperative enough
- ; and there are people around to follow.
-
- cmp.w #1,numfriends
- blt.s mustretreat
-
- cmp.w #10,d2
- bgt.s CNAC
-
- mustretreat:
-
- ; The thing is combatant but
- ; unaggressive, and so should run away,
- ; at a speed dependant upon movement.
- ; The thing is so unaggressive it will
- ; not fire weapons if armed.
-
- move.l closeenemy,a2
- move.w (a2),d0
- lea (a4,d0.w*8),a1
- move.w (a1),newx
- move.w 4(a1),newz
- move.w maxspd(a0),d2
- muls TempFrames,d2
- neg.w d2
- cmp.w #10,d1
- bge.s .topspeed
- tst.w d3
- bgt.s .topspeed
- asr.w #1,d2
- .topspeed
- move.w d2,speed
- move.w #20,Range
- move.l FromRoom,objroom
-
- movem.l a0/a1/a4,-(a7)
-
- jsr HeadTowardsAng
- jsr MoveObject
-
- movem.l (a7)+,a0/a1/a4
-
- move.w (a0),d0
- lea (a4,d0.w*8),a1
- move.w newx,(a1)
- move.w newz,4(a1)
- move.l objroom,a2
- move.w (a2),12(a0)
-
- rts
-
- CNAC:
- ; Combatant, cooperative but unaggressive
- ; means it should head in a direction
- ; away from the enemy but towards
- ; its leader, if there is one.
- ; It should also not fire if armed.
-
- ; for now use followothers
-
- bra FollowOthers
-
-
-
- tst.b Armed
- beq.s .nofire
-
- move.l a0,-(a7)
- move.w (a1),tempxoff
- move.w 4(a1),tempzoff
- move.w SinRet(pc),tempxdir
- move.w CosRet(pc),tempzdir
- move.w #3,tempGunNoise
- move.b #0,tempGotBigGun
- move.b #1,tempGunDamage
- move.l objroom,tempRoompt
- bsr pressedfire
- move.l (a7)+,a0
- .nofire:
-
- rts
-
-
- NonCombatant:
-
- ; No enemy is visible so we need
- ; to make the creature behave
- ; appropriately. This could be
- ; staying still and looking around,
- ; following noises, or wandering
- ; around looking for trouble.
-
- move.w Aggression,d0
- move.w Movement,d1
- move.w Cooperation,d2
-
- ; If high cooperation, follow the
- ; nearest visible leader or thing of
- ; equal status, otherwise
- ; behave independantly.
-
- tst.w numfriends
- beq noonetofollow
- cmp.w #10,d2
- bgt FollowOthers
-
- noonetofollow:
-
- rts
-
- FollowOthers:
- move.l #VisibleTab,a1
- move.l #ObjectData,a3
-
- move.w Lead(a0),d0
- move.w #1000,d7
-
- findleader:
- tst.w (a3)
- blt.s nomore
- tst.b (a1)
- beq.s .notvis
-
- move.w Lead(a3),d1
- cmp.w d1,d0
- bgt.s .notgoodenough
- cmp.w d7,d1
- bgt.s .toogood
-
- move.w d1,d7
- move.l a3,a5
-
- .toogood
- .notgoodenough:
-
- .notvis:
-
- adda.w #64,a3
- addq #6,a1
- bra findleader
- nomore:
-
- move.l FromRoom,objroom
- move.w d7,d0
- blt noonetofollow
-
- move.w d0,tstlead
-
- move.w (a5),d0
- lea (a4,d0.w*8),a1
- move.w (a1),newx
- move.w 4(a1),newz
- move.w maxspd(a0),d2
- muls TempFrames,d2
- move.w d2,speed
- move.w #100,Range
-
- movem.l a0/a1/a4,-(a7)
-
- jsr HeadTowardsAng
- jsr MoveObject
-
- movem.l (a7)+,a0/a1/a4
-
- move.w (a0),d0
- lea (a4,d0.w*8),a1
- move.w newx,(a1)
- move.w newz,4(a1)
- move.l objroom,a2
- move.w (a2),12(a0)
-
- rts
-
- tstlead: dc.w 0